{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fraud Detector - Minimal Prediction API Example \n",
    "#### Supervised fraud detection  \n",
    "-------\n",
    "\n",
    "## Setup\n",
    "------\n",
    "First setup your AWS credentials so that Fraud Detector can store and access training data and supporting detector artifacts.\n",
    "\n",
    "https://docs.aws.amazon.com/frauddetector/latest/ug/set-up.html\n",
    "\n",
    "To use Amazon Fraud Detector, you have to set up permissions that allow access to the Amazon Fraud Detector console and API operations. You also have to allow Amazon Fraud Detector to perform tasks on your behalf and to access resources that you own.\n",
    "\n",
    "We recommend creating an AWS Identify and Access Management (IAM) user with access restricted to Amazon Fraud Detector operations and required permissions. You can add other permissions as needed.\n",
    "\n",
    "## Plan\n",
    "------\n",
    "\n",
    "You'll need the following pieces of information to make predictions on your dataset. \n",
    "\n",
    "- ENTITY_TYPE  \n",
    "- EVENT_TYPE    \n",
    "- DETECTOR_NAME & VERSION\n",
    "\n",
    "\n",
    "You'll also need to identify how many records you'd like to predict on.  \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>.container { width:90% }</style>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from IPython.core.display import display, HTML\n",
    "from IPython.display import clear_output\n",
    "display(HTML(\"<style>.container { width:90% }</style>\"))\n",
    "# ------------------------------------------------------------------\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "import numpy as np\n",
    "np.seterr(divide='ignore', invalid='ignore')\n",
    "\n",
    "\n",
    "import pandas as pd\n",
    "import uuid \n",
    "from datetime import datetime\n",
    "\n",
    "pd.set_option('display.max_rows', 500)\n",
    "pd.set_option('display.max_columns', 500)\n",
    "pd.set_option('display.width', 1000)\n",
    "\n",
    "# -- dask for parallelism -- \n",
    "import dask \n",
    "\n",
    "# -- standard stuff -- \n",
    "import time\n",
    "from datetime import datetime\n",
    "\n",
    "# -- AWS stuff -- \n",
    "import boto3\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Initialize AWS Fraud Detector Client \n",
    "------\n",
    "\n",
    "https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/frauddetector.html \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# -- fraud detector client --\n",
    "client = boto3.client('frauddetector',)\n",
    "\n",
    "# -- use this to append to files \n",
    "sufx   = datetime.now().strftime(\"%Y%m%d\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Entity, Detector, Model, and File Information  \n",
    "-----\n",
    "<div class=\"alert alert-info\"> 💡 <strong> Entity, Detector, and Files. </strong>\n",
    "\n",
    "- DETECTOR_NAME & VERSION corresponds to the name and version of your deployed Fraud Detector  \n",
    "- MODEL_NAME & VERSION corresponds to the name and version of the model deployed with your Fraud Detector   \n",
    "- S3_BUCKET & S3_FILE this is the information on the S3 file you wish to apply your detector to.   \n",
    "\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "ENTITY_TYPE    = \"your_entity_type\"\n",
    "EVENT_TYPE     = \"your_event_type\" \n",
    "\n",
    "DETECTOR_NAME = \"your_detector_name\"\n",
    "DETECTOR_VER  = \"your_detector_version\"\n",
    "\n",
    "# -- name and version of model, used to get the model column names -- \n",
    "MODEL_NAME    = \"your_model_name\"\n",
    "MODEL_VER     = \"your_model_version\"\n",
    "\n",
    "# s3://afd-training-data/schwab_sample_prep.csv\n",
    "\n",
    "# -- input file of data to be scored -- \n",
    "ARN_ROLE      = \"your_iam_arn_role\" \n",
    "S3_BUCKET     = \"your_bucket_name\"\n",
    "S3_FILE       = \"your_prediction_file.csv\"\n",
    "S3_FILE_LOC   = \"s3://{0}/{1}\".format(S3_BUCKET,S3_FILE)\n",
    "\n",
    "# -- run 100 records, you can change this here or below to run the whole file.\n",
    "record_count = 100"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Load Data to be Scored \n",
    "-----\n",
    "<div class=\"alert alert-info\"> 💡 <strong> Check the first 5 Records. </strong>\n",
    "\n",
    "Does your data look correct? Do you need to rename any columns? You want the column names to match the field names used by the Model. \n",
    "\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ip_address</th>\n",
       "      <th>email_address</th>\n",
       "      <th>user_agent</th>\n",
       "      <th>customer_city</th>\n",
       "      <th>customer_state</th>\n",
       "      <th>customer_postal</th>\n",
       "      <th>EVENT_TIMESTAMP</th>\n",
       "      <th>customer_name</th>\n",
       "      <th>customer_address</th>\n",
       "      <th>phone_number</th>\n",
       "      <th>EVENT_LABEL</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>84.138.6.238</td>\n",
       "      <td>synth_tmorton@yahoo.com</td>\n",
       "      <td>Mozilla/5.0 (X11; Linux i686) AppleWebKit/535....</td>\n",
       "      <td>Meganstad</td>\n",
       "      <td>LA</td>\n",
       "      <td>32733.0</td>\n",
       "      <td>2020-04-11 17:27:38</td>\n",
       "      <td>Brandon Moran</td>\n",
       "      <td>824 Price Bypass</td>\n",
       "      <td>(555)784 - 5238</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>194.147.250.63</td>\n",
       "      <td>synth_oscott@yahoo.com</td>\n",
       "      <td>Mozilla/5.0 (Macintosh; PPC Mac OS X 10_6_4 rv...</td>\n",
       "      <td>Christinaport</td>\n",
       "      <td>MN</td>\n",
       "      <td>34319.0</td>\n",
       "      <td>2020-04-11 17:31:12</td>\n",
       "      <td>Dominic Murray</td>\n",
       "      <td>13515 Ashley Haven Apt. 472</td>\n",
       "      <td>(555)114 - 6133</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>192.54.60.50</td>\n",
       "      <td>synth_aoliver@gmail.com</td>\n",
       "      <td>Mozilla/5.0 (iPad; CPU iPad OS 3_1_3 like Mac ...</td>\n",
       "      <td>Donaldfurt</td>\n",
       "      <td>WA</td>\n",
       "      <td>32436.0</td>\n",
       "      <td>2020-04-11 17:46:34</td>\n",
       "      <td>Anthony Abbott</td>\n",
       "      <td>039 Amy Glens</td>\n",
       "      <td>(555)780 - 7652</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>169.120.193.154</td>\n",
       "      <td>synth_clewis@gmail.com</td>\n",
       "      <td>Mozilla/5.0 (Macintosh; PPC Mac OS X 10_10_9; ...</td>\n",
       "      <td>Williamburgh</td>\n",
       "      <td>AL</td>\n",
       "      <td>34399.0</td>\n",
       "      <td>2020-04-11 17:48:52</td>\n",
       "      <td>Kimberly Webb</td>\n",
       "      <td>81397 Tom Forge</td>\n",
       "      <td>(555)588 - 4426</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>192.175.55.43</td>\n",
       "      <td>synth_katherinedavis@hotmail.com</td>\n",
       "      <td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_0 ...</td>\n",
       "      <td>East Markland</td>\n",
       "      <td>IL</td>\n",
       "      <td>33690.0</td>\n",
       "      <td>2020-04-11 17:49:23</td>\n",
       "      <td>Renee James</td>\n",
       "      <td>6815 Dawson Estate</td>\n",
       "      <td>(555)785 - 8274</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        ip_address                     email_address                                         user_agent  customer_city customer_state  customer_postal      EVENT_TIMESTAMP   customer_name             customer_address     phone_number  EVENT_LABEL\n",
       "0     84.138.6.238           synth_tmorton@yahoo.com  Mozilla/5.0 (X11; Linux i686) AppleWebKit/535....      Meganstad             LA          32733.0  2020-04-11 17:27:38   Brandon Moran             824 Price Bypass  (555)784 - 5238            0\n",
       "1   194.147.250.63            synth_oscott@yahoo.com  Mozilla/5.0 (Macintosh; PPC Mac OS X 10_6_4 rv...  Christinaport             MN          34319.0  2020-04-11 17:31:12  Dominic Murray  13515 Ashley Haven Apt. 472  (555)114 - 6133            0\n",
       "2     192.54.60.50           synth_aoliver@gmail.com  Mozilla/5.0 (iPad; CPU iPad OS 3_1_3 like Mac ...     Donaldfurt             WA          32436.0  2020-04-11 17:46:34  Anthony Abbott                039 Amy Glens  (555)780 - 7652            0\n",
       "3  169.120.193.154            synth_clewis@gmail.com  Mozilla/5.0 (Macintosh; PPC Mac OS X 10_10_9; ...   Williamburgh             AL          34399.0  2020-04-11 17:48:52   Kimberly Webb              81397 Tom Forge  (555)588 - 4426            0\n",
       "4    192.175.55.43  synth_katherinedavis@hotmail.com  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_0 ...  East Markland             IL          33690.0  2020-04-11 17:49:23     Renee James           6815 Dawson Estate  (555)785 - 8274            0"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# -- connect to S3, snag file, and convert to a panda's dataframe --\n",
    "s3   = boto3.resource('s3')\n",
    "obj  = s3.Object(S3_BUCKET, S3_FILE)\n",
    "body = obj.get()['Body']\n",
    "df   = pd.read_csv(body)\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Run Predictions  \n",
    "-----\n",
    "The following applies the get_event_prediction endpoint to your recrods in your data frame.    \n",
    "\n",
    "<i> Note: this uses the Dask backend to parallelize the prediction calls. </i>\n",
    "\n",
    "<div class=\"alert alert-info\"> 💡 <strong> get_event_prediction </strong>\n",
    "\n",
    "To specify the number of records to score you change the record_count to a specific number (e.g., if you want to just predict on say 100 records). By default it assumes you want to apply predictions to the whole dataset. Once completed convert json to a pandas dataframe, and appends any existing labels, and analyze based on score threshold for a particular false positive rate (FPR).\n",
    "\n",
    "</div>\n",
    "\n",
    "this is all you need to run predictions: \n",
    "\n",
    "```python\n",
    "\n",
    "client.get_event_prediction(detectorId=DETECTOR_NAME, \n",
    "                            detectorVersionId=DETECTOR_VERSION,\n",
    "                            eventId = '222222',\n",
    "                            eventTypeName = EVENT_TYPE,\n",
    "                            eventTimestamp = '2020-07-27 12:01:01', \n",
    "                            entities = [{'entityType': ENTITY_TYPE, 'entityId':'11111'}],\n",
    "                            eventVariables=  record)\n",
    "```\n",
    "\n",
    "\n",
    "Example of what a record would look like: \n",
    "\n",
    "```python\n",
    "record = [{'order_amt': '8036.0',\n",
    "  'ip_address': '192.18.59.93',\n",
    "  'email_address': 'synth_george_hayduke@example.com',\n",
    "  'cc_bin': '42785',\n",
    "  'billing_postal': '17740-2745',\n",
    "  'shipping_postal': '20950-6945',\n",
    "  'customer_name': 'Geroge Hayduke'}]\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " -- event variables -- \n",
      "['ip_address', 'email_address', 'user_agent', 'customer_city', 'customer_state', 'customer_postal', 'customer_name', 'customer_address', 'phone_number']\n"
     ]
    }
   ],
   "source": [
    "def get_event_variables(EVENT_TYPE):\n",
    "    \"\"\" return list of variables used by a model \n",
    "    \n",
    "    \"\"\"\n",
    "    response = client.get_event_types(name=EVENT_TYPE)\n",
    "    event_variables = []\n",
    "\n",
    "    for v in response['eventTypes'][0]['eventVariables']:\n",
    "        event_variables.append(v)\n",
    "    return event_variables\n",
    "\n",
    "event_variables = get_event_variables(EVENT_TYPE)\n",
    "print(\"\\n -- event variables -- \")\n",
    "print(event_variables)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "current progress:  100.0 %\n",
      "Process took 120.60 seconds\n",
      "Scored 5000 records\n"
     ]
    }
   ],
   "source": [
    "# record_count = df.shape[0] # -- uncomment this to run all of the records -- \n",
    "dateTimeObj = datetime.now()\n",
    "timestampStr = dateTimeObj.strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n",
    "\n",
    "\n",
    "start = time.time()\n",
    "\n",
    "@dask.delayed\n",
    "def _predict(record):\n",
    "    eventId = uuid.uuid1()\n",
    "    try:\n",
    "        pred = client.get_event_prediction(detectorId=DETECTOR_NAME, \n",
    "                                       detectorVersionId=DETECTOR_VER,\n",
    "                                       eventId = str(eventId),\n",
    "                                       eventTypeName = EVENT_TYPE,\n",
    "                                       eventTimestamp = timestampStr, \n",
    "                                       entities = [{'entityType': ENTITY_TYPE, 'entityId':str(eventId.int)}],\n",
    "                                       eventVariables=  record) \n",
    "        \n",
    "        record[\"score\"]   = pred['modelScores'][0]['scores'][\"{0}_insightscore\".format(MODEL_NAME)]\n",
    "        record[\"outcomes\"]= pred['ruleResults'][0]['outcomes']\n",
    "        return record\n",
    "    \n",
    "    except:\n",
    "        record[\"score\"]   = [\"-999\"]\n",
    "        record[\"outcomes\"]= [\"error\"]\n",
    "        return record\n",
    "\n",
    "    \n",
    "predict_data  = df[event_variables].head(record_count).astype(str).to_dict(orient='records')\n",
    "predict_score = []\n",
    "\n",
    "i=0\n",
    "for record in predict_data:\n",
    "    clear_output(wait=True)\n",
    "    rec = dask.delayed(_predict)(record)\n",
    "    predict_score.append(rec)\n",
    "    i += 1\n",
    "    print(\"current progress: \", round((i/record_count)*100,2), \"%\" )\n",
    "    \n",
    "\n",
    "predict_recs = dask.compute(*predict_score)\n",
    "\n",
    "# Calculate time taken and print results\n",
    "time_taken = time.time() - start\n",
    "tps = len(predict_recs) / time_taken\n",
    "\n",
    "print ('Process took %0.2f seconds' %time_taken)\n",
    "print ('Scored %d records' %len(predict_recs))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Take a look at your predictions\n",
    "-----\n",
    "Each record will have a score and the outcome of any rule conditions met. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ip_address</th>\n",
       "      <th>email_address</th>\n",
       "      <th>user_agent</th>\n",
       "      <th>customer_city</th>\n",
       "      <th>customer_state</th>\n",
       "      <th>customer_postal</th>\n",
       "      <th>customer_name</th>\n",
       "      <th>customer_address</th>\n",
       "      <th>phone_number</th>\n",
       "      <th>score</th>\n",
       "      <th>outcomes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>84.138.6.238</td>\n",
       "      <td>synth_tmorton@yahoo.com</td>\n",
       "      <td>Mozilla/5.0 (X11; Linux i686) AppleWebKit/535....</td>\n",
       "      <td>Meganstad</td>\n",
       "      <td>LA</td>\n",
       "      <td>32733.0</td>\n",
       "      <td>Brandon Moran</td>\n",
       "      <td>824 Price Bypass</td>\n",
       "      <td>(555)784 - 5238</td>\n",
       "      <td>5.0</td>\n",
       "      <td>[approve]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>194.147.250.63</td>\n",
       "      <td>synth_oscott@yahoo.com</td>\n",
       "      <td>Mozilla/5.0 (Macintosh; PPC Mac OS X 10_6_4 rv...</td>\n",
       "      <td>Christinaport</td>\n",
       "      <td>MN</td>\n",
       "      <td>34319.0</td>\n",
       "      <td>Dominic Murray</td>\n",
       "      <td>13515 Ashley Haven Apt. 472</td>\n",
       "      <td>(555)114 - 6133</td>\n",
       "      <td>4.0</td>\n",
       "      <td>[approve]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>192.54.60.50</td>\n",
       "      <td>synth_aoliver@gmail.com</td>\n",
       "      <td>Mozilla/5.0 (iPad; CPU iPad OS 3_1_3 like Mac ...</td>\n",
       "      <td>Donaldfurt</td>\n",
       "      <td>WA</td>\n",
       "      <td>32436.0</td>\n",
       "      <td>Anthony Abbott</td>\n",
       "      <td>039 Amy Glens</td>\n",
       "      <td>(555)780 - 7652</td>\n",
       "      <td>5.0</td>\n",
       "      <td>[approve]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>169.120.193.154</td>\n",
       "      <td>synth_clewis@gmail.com</td>\n",
       "      <td>Mozilla/5.0 (Macintosh; PPC Mac OS X 10_10_9; ...</td>\n",
       "      <td>Williamburgh</td>\n",
       "      <td>AL</td>\n",
       "      <td>34399.0</td>\n",
       "      <td>Kimberly Webb</td>\n",
       "      <td>81397 Tom Forge</td>\n",
       "      <td>(555)588 - 4426</td>\n",
       "      <td>938.0</td>\n",
       "      <td>[review]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>192.175.55.43</td>\n",
       "      <td>synth_katherinedavis@hotmail.com</td>\n",
       "      <td>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_0 ...</td>\n",
       "      <td>East Markland</td>\n",
       "      <td>IL</td>\n",
       "      <td>33690.0</td>\n",
       "      <td>Renee James</td>\n",
       "      <td>6815 Dawson Estate</td>\n",
       "      <td>(555)785 - 8274</td>\n",
       "      <td>16.0</td>\n",
       "      <td>[approve]</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        ip_address                     email_address                                         user_agent  customer_city customer_state customer_postal   customer_name             customer_address     phone_number  score   outcomes\n",
       "0     84.138.6.238           synth_tmorton@yahoo.com  Mozilla/5.0 (X11; Linux i686) AppleWebKit/535....      Meganstad             LA         32733.0   Brandon Moran             824 Price Bypass  (555)784 - 5238    5.0  [approve]\n",
       "1   194.147.250.63            synth_oscott@yahoo.com  Mozilla/5.0 (Macintosh; PPC Mac OS X 10_6_4 rv...  Christinaport             MN         34319.0  Dominic Murray  13515 Ashley Haven Apt. 472  (555)114 - 6133    4.0  [approve]\n",
       "2     192.54.60.50           synth_aoliver@gmail.com  Mozilla/5.0 (iPad; CPU iPad OS 3_1_3 like Mac ...     Donaldfurt             WA         32436.0  Anthony Abbott                039 Amy Glens  (555)780 - 7652    5.0  [approve]\n",
       "3  169.120.193.154            synth_clewis@gmail.com  Mozilla/5.0 (Macintosh; PPC Mac OS X 10_10_9; ...   Williamburgh             AL         34399.0   Kimberly Webb              81397 Tom Forge  (555)588 - 4426  938.0   [review]\n",
       "4    192.175.55.43  synth_katherinedavis@hotmail.com  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_0 ...  East Markland             IL         33690.0     Renee James           6815 Dawson Estate  (555)785 - 8274   16.0  [approve]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predictions = pd.DataFrame.from_dict(predict_recs, orient='columns')\n",
    "predictions.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Make a Histogram of Scores \n",
    "-----\n",
    "check out the distrirbution of scores. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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AAAmefe7u4EiCQAAAGCiM8/sBookAAAAAIZRJAEAAAAwiCIJAAAAgEEUSQAAAAAMMm/WAQAAAABGbdGiWScYDTOSAAAAABhEkQQAAAAwydvf3g0USQAAAAATfexj3UCRBAAAAMAwiiQAAAAABlEkAQAAADDIvFkHAAAAABi1ddeddYLRUCQBAAAATPKJT8w6wWhY2gYAAADAIIokAAAAgEne9KZuoEgCAAAAmOjCC7uBIgkAAABgTTv66KPzuMc9Lo973ONyxhlnLD9/4YUXZpdddsmCBQvyxCc+Mddee22S5JRTTsnmm2+eBQsWZMGCBXnf+943k9w22wYAAADWSnfddVfmzRtWjfzgpz/NxqvpfT/+8Y/n0ksvzeLFi/PjH/84e+65Z/bbb79ssMEGeelLX5qPfOQjecxjHpN3v/vdOe6443LKKackSQ466KC8613vWk0pfjlmJAEAAAD3C7fffnue9rSnZaeddvqFmTxf/epXs8cee2SnnXbK4x//+Nx222350Y9+lEMPPTQ77rhjdt5551x00UVJupk9Bx54YA444IDsu+++SZK3ve1t2XXXXfPbv/3bef3rX7/S937W17+eZzzjGTnnnHNy11133afP8Y1vfCN77rln5s2bl/XXXz877bRTPvnJTyZJqiq33nprkuSWW27JIx/5yPv0XqubGUkAAADA/cInP/nJPPKRj8zHP/7xJF3R8pOf/CQHHXRQzjjjjOy666659dZbs+666+ad73xnkuTyyy/PlVdemX333TdXX311kuSLX/xiLrvssmyyySY577zzcs011+QrX/lKWmt5xjOekc9+9rN50pOe9PM33nTTLHryk/PZP/3TfOADH8iRRx6ZAw88MIcddlge/ehHJ+nKqA996EN3y/ykJz0pJ5544i+c22mnnfLGN74xRx55ZO64445cdNFFeexjH5sked/73pf9998/6667bjbYYIN86UtfWv68s88+O5/97Gez3Xbb5fjjj8/8+fNX35c70NRmJFXV9lW1eM64taqOqKpNqur8qrqmP27c319VdWJVXVtVl1XVLtPKBgAAANz/7Ljjjrngggty9NFH55//+Z+z4YYb5qqrrsoWW2yRXXfdNUmywQYbZN68efnc5z6Xgw8+OEmyww475FGPetTyIukpT3lKNtlkkyTJeeedl/POOy8777xzdtlll1x55ZW55pprfvGNzz479Q//kD333DOnnnpqLr300qyzzjrZYYcdcvbZZydJXvWqV2Xx4sV3GyuWSEmy7777Zv/9988ee+yRP/zDP8zuu+++fInd8ccfn3PPPTdLlizJoYcemiOPPDJJcsABB+Rb3/pWLrvssuyzzz455JBDVv8XPMDUiqTW2lWttQWttQVJfifJHUn+Mcmrk1zYWts2yYX930myX5Jt+3F4kpOmlQ0AAAC4/9luu+1yySWXZMcdd8wxxxyTP//zP09rLVV1t3tba/f4Ouuvv/4v3HfMMccsL36uvfbaHHbYYSt93p133pkPf/jD+YM/+IN86lOfyjvf+c485SlPSdLNSFq2Efbc8YpXvGKlr/Wa17wmixcvzvnnn5/WWrbddtssXbo0X/va1/KEJzwhSbcn0he+8IUkyaabbpoHP/jBSZIXvehFueSSSwZ8Y6vfmtojae8k/9Za+48kz0xyan/+1CTP6h8/M8kHW+dLSTaqqi3WUD4AAABg5G644Yast956ef7zn59XvvKVufTSS7PDDjvkhhtuyFe/+tUkyW233Za77rorT3rSk5YvNbv66qtz3XXXZfvtt7/baz71qU/NBz7wgfzwhz9Mknz729/Od7/73V+86Zhj8me77ZbHPvax+fznP5+3ve1tufjii/Pyl788G2ywQZJ7NyPpZz/7WW666aYkyWWXXZbLLrss++67bzbeeOPccssty2dOnX/++XnMYx6TJLnxxhuXP/+cc85Zfn5NW1N7JD0vyd/2jx/RWrsxSVprN1bVw/vzWya5fs5zlvTnbpxzLlV1eLoZS9l6662nmRkAAAAYkcsvvzyvetWrss466+SBD3xgTjrppDzoQQ/KGWeckT/5kz/JnXfemXXXXTcXXHBBXvayl+UlL3lJdtxxx8ybNy+nnHLK8hk9c+2777654oorsvvuuydJHvrQh+b000/Pwx/+8J/f9MUvZq/bb8+fX3FFHvKQh9znz/HTn/40v/d7v5ekW4p3+umnL1/a9t73vjfPfvazs84662TjjTfOBz7wgSTJiSeemHPOOSfz5s3LJptssvyX3Na0mjTVa7W8QdWDktyQ5Ldaa9+pqptbaxvNuf6D1trGVfXxJG9prX2uP39hkj9rrd3jXK2FCxe2iy++eKr515g3bDjh2i1rLgcAAADwi/baqzsuWjTL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\n",
      "text/plain": [
       "<Figure size 1440x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "predictions['score_bin'] = pd.cut(predictions['score'],100 ,labels= list(range(0,1000,10)))\n",
    "predictions.loc[predictions['score'] >= 985, 'score_outcome'] = 'predicted fraud'\n",
    "predictions.loc[predictions['score'] < 985, 'score_outcome'] = 'predicted legit'\n",
    "ctab = pd.crosstab(predictions['score_bin'], predictions['score_outcome']).reset_index()\n",
    "\n",
    "plt.figure(figsize=(20,10))\n",
    "plt.bar(ctab['score_bin'], ctab['predicted fraud'], width=7)\n",
    "plt.bar(ctab['score_bin'], ctab['predicted legit'], width=7)\n",
    "plt.axvline(x=985, ls='--', C='red')\n",
    "plt.title(\"Sample Data, Score Distribution\")\n",
    "plt.text( 955, 700, 'score >= 985')\n",
    "plt.xlabel('Score')\n",
    "plt.ylabel('Frequency')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Take a look at your prediction outcomes\n",
    "-----\n",
    "see the potential impact from actions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>outcomes</th>\n",
       "      <th>mean</th>\n",
       "      <th>count</th>\n",
       "      <th>pct_total</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>['approve']</td>\n",
       "      <td>145.617136</td>\n",
       "      <td>4260</td>\n",
       "      <td>0.8520</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>['block']</td>\n",
       "      <td>995.695402</td>\n",
       "      <td>174</td>\n",
       "      <td>0.0348</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>['friction']</td>\n",
       "      <td>715.832402</td>\n",
       "      <td>358</td>\n",
       "      <td>0.0716</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>['review']</td>\n",
       "      <td>930.423077</td>\n",
       "      <td>208</td>\n",
       "      <td>0.0416</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       outcomes        mean  count  pct_total\n",
       "0   ['approve']  145.617136   4260     0.8520\n",
       "1     ['block']  995.695402    174     0.0348\n",
       "2  ['friction']  715.832402    358     0.0716\n",
       "3    ['review']  930.423077    208     0.0416"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predictions['outcomes'] = predictions['outcomes'].astype(str)\n",
    "pred_summary = predictions.groupby(['outcomes'])['score'].agg(['mean', 'count']).reset_index()\n",
    "pred_summary['pct_total'] = pred_summary['count']/predictions.shape[0]\n",
    "pred_summary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Confusion Matrix by Outcome\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABGEAAAFNCAYAAACgxnLYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdeZyNdf/H8ddnZkyWYRjLjBgK4y4htyQtwihERaHuNm13fnd3myi0l9JmbZFC692mqAiRRqKy1l0K3Vmym5Etu9m+vz/OMc0ww8RZ5jrez8fjPJxzXd9zne91nJnzns/1vb6XOecQEREREREREZHgigp3B0REREREREREjgcqwoiIiIiIiIiIhICKMCIiIiIiIiIiIaAijIiIiIiIiIhICKgIIyIiIiIiIiISAirCiIiIiIiIiIiEgIowIiIiIiIiIiIhoCKMSJiY2dVmttDMdpnZRjP7zMzOC/JrOjOrF8zXEBEREYkEZrbKzPb6s1qGmb1uZnGHad/azNaFso8i4j0qwoiEgZn1BoYDTwKJQC3gJaBzOPslIiIiIgVc4pyLA5oCZwIPhrk/IuJxKsKIhJiZxQMDgNuccx8553Y757Kcc5865+41sxPMbLiZbfDfhpvZCf7n3mBmXx+0vbzRLWb2hpmNMLPJZrbTzOaZWV3/uln+p/zoP6JzpZlVMbNJZrbdzLaa2Wwz0+8FERERkXycc+uBz4CGZpbgHxWzwcy2mdknZlbOv/5Ef87aZWYnhrfXIlIS6Y8tkdA7GygNfFzE+geAFkAT4HSgOX/tqMtVwGNAJWA5MBDAOXe+f/3pzrk459xYoA+wDqiKb0TO/YD7KzsjIiIiEunMLBnoCPwX+A9QFjgNqAYMc87tBi4CNvhzVpxzbkPYOiwiJVZMuDsgchyqDGx2zmUXsf4a4A7n3CYAM3sMeAV4qJjb/8g5N9//3HeAoYdpmwVUB2o755YDs4v5GiIiIiLHg0/MLBv4A5iM7/Tx9UBl59w2f5uvwtU5EfEejYQRCb0tQBUzK6oIeiKwOt/j1f5lxZWe7/4eoMgJ5IBB+EbLfG5mK82s/194HREREZFI18U5V9E5V9s5928gGdiarwAjIvKXqAgjEnpzgH1AlyLWbwBq53tcy78MYDe+4a8AmFnSsXTEObfTOdfHOVcHuATobWZtj2WbIiIiIhFsLZBgZhULWadTukXkiFSEEQkx59wfwMPACDPrYmZlzayUmV1kZs8C7wEPmllVM6vib/u2/+k/AqeZWRMzKw08+hdfPgOoc+CBmV1sZvXMzIAdQI7/JiIiIiIHcc5txDcB70tmVsmf4Q7Mu5cBVPZfhEFEpFAqwoiEgXNuKNAb34S7v+M7qnI78AnwBLAQWAT8BHzvX4Zz7ld8V1b6AlgGfH3wto/gUeBN/9WQrgBS/NvahW+EzkvOuZnHsGsiIiIike46fPPq/QJsAnoBOOd+wXcwbaU/a+nqSCJyCHNOo+ZERERERERERIJNI2FEREREREREREJARRgREREPMLNVZvaTmf1gZgv9yxLMbLqZLfP/W8m/3MzseTNbbmaLzKxpvu1c72+/zMyuD9f+iIiIiJR0ZvaamW0ys5+LWF9k5iqKijAiIiLe0cY518Q518z/uD+Q5pxLAdL8jwEuwjfnUwrQExgJvqIN8AhwFtAceORA4UZEREREDvEG0OEw6wvNXIejIoyIiIh3dQbe9N9/E+iSb/lbzmcuUNHMqgPtgenOua3OuW3AdA4fLERERESOW865WcDWwzQpKnMVSUUYERERb3DA52b2nZn19C9L9F8u9cBlU6v5l9fAd9W1A9b5lxW1XERERET+ur+crWKC2p1jkNLyFV226Rgtm90m3F3wvD3Zv4e7C54XGxUX7i54XtKpr4e7CxFh8/+GW7Bfo0ytq47qu2vf2vf/D98Q1gNGOedGHdTsXOfcBjOrBkw3s18Os8nC9tUdZrlIHmWwY6cMduyUwY7dCdHlw90Fz0s85bVwdyEiREAGO5y/nK1KbBFGRETkeOH/sj/sF75zboP/301m9jG+OV0yzKy6c26jf+jrJn/zdUByvqfXBDb4l7c+aPnMQOyDiIiIiNcUJ4MdQVGZq0g6HUlERCRAzKKO6nbk7Vo5Myt/4D7QDvgZmAgcuMLR9cAE//2JQA//jP0tgD/8pytNA9qZWSX/hLzt/MtEREREPCtYGawYispcRdJIGBERkQCx4B3bSAQ+NjPwfXe/65ybamYLgA/M7GZgDdDd334K0BFYDuwBbgRwzm01s8eBBf52A5xzh5tsTkRERKTEC1YGM7P38I0irmJm6/BdZbIUgHPuZYrIXIejIoyIiEiABOiIyiGccyuB0wtZvgVoW8hyB9xWxLZeA3SSu4iIiESMIGawq46wvsjMVRQVYURERAIkWAFARERERIrmpQymIoyIiEiA+E8XEhEREZEQ8lIGUxFGREQkYLxzFEZEREQkcngng6kIIyIiEiBeGgorIiIiEim8lMFUhBEREQkQLwUAERERkUjhpQymIoyIiEiABPES1SIiIiJSBC9lMBVhREREAsRLR2FEREREIoWXMpiKMCIiIgHipQAgIiIiEim8lMFUhBEREQkQLwUAERERkUjhpQymIoyIiEiAGBbuLoiIiIgcd7yUwVSEERERCRAvHYURERERiRReymAqwoiIiASIlwKAiIiISKTwUgZTEUZERCRAvBQARERERCKFlzKYd3oqIiIiIiIiIuJhGgkjIiISMDq2ISIiIhJ63slgKsKIiIgEiJeGwoqIiIhECi9lMBVhREREAsRLAUBEREQkUngpg6kIIyIiEiDmoaGwIiIiIpHCSxlMRRgREZEA8dJRGBEREZFI4aUMpiKMiIhIgJhZuLsgIiIictzxUgZTEUZERCRAvHQURkRERCRSeCmDqQgjIiISIF46H1lEREQkUngpg6kIIyIiEiBeOgojIiIiEim8lMFUhBEREQkQLwUAERERkUjhpQymIoyIiEiAeGkorIiIiEik8FIGUxFGREQkUDx0FEZEREQkYngog6kIIyIiEiBeGgorIiIiEim8lMFUhBEREQkQMwt3F0RERESOO17KYCrCiIiIBIiXzkcWERERiRReymAqwoiIiASIl4bCioiIiEQKL2Uw7/RURERERERERMTDNBJGREQkUDx0PrKIiIhIxPBQBlMRRkREJFA0vlREREQk9DyUwVSEERERCRQPHYURERERiRgeymAqwoiIiASKhwKAiIiISMTwUAZTEUZERCRQPDQUVkRERCRieCiDqQhTiKgo4+PRl5OxeTc9+01lyEOpNDylKtnZuSxauomHBs0mOyeX5k2q8/JT7Vm3cScAn8/6jRff+J6kauUY9EAbqiaUJdc5xk5cypvjfg7zXoXfffc9x8yZC6hcOZ5Jk0YAMHz426SlzSMqyqhcOZ6nnupFYmLlMPe05Ni/P4ubezxNZmYWOTm5XNCuGbfe3iVv/dMD32Hix1/z7cKRAGzcsIWH73+VnTv3kJubyx13d6Pl+Y3D1f0S48EHXuKrmd+TkBDPhE+HFFj3+msTGTzobb7+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4JxbbGYfAEuAbOA251xOKDssIiIiEhRByGDOuWwzux2YBkQDr/nz1ABgoXNuItAHGG1md+M7VekG/8GvIqkIIyIiEihBLsI452YCM/33V1LI1Y2cc/uA7kU8fyAwMHg9FBEREQmDIGUw59wUfBPu5l/2cL77S/CdOl5sKsKIiIgEik7yFREREQk9D2UwFWFEREQCJbSnI4mIiIgIeCqDqQgjIiISKN75/hcRERGJHB7KYCrCiIiIBIgLzuURRUREROQwvJTBVIQREREJFA8NhRURERGJGB7KYCrCiIiIBIp3vv9FREREIoeHMpiKMGc5wkoAACAASURBVCIiIoHioaGwIiIiIhHDQxlMRRgREZFA8dBQWBEREZGI4aEMpiKMiIhIoHjn+19EREQkcngog0WFuwMiIiIiIiIiIscDjYQREREJFA+djywiIiISMTyUwVSEERERCRQPBQARERGRiOGhDKYijIiISIA473z/i4iIiEQML2UwFWFEREQCxUNHYUREREQihocymIowIiIigeKhyyOKiIiIRAwPZTAVYURERALFQ0dhRERERCKGhzKYijAiIiKBEhXuDoiIiIgchzyUwVSEERERCRQPDYUVERERiRgeymAqwoiIiASKh4bCioiIiEQMD2UwFWFEREQCxHnoKIyIiIhIpPBSBlMRRkREJFA8dD6yiIiISMTwUAZTEUZERCRQPDQUVkRERCRieCiDqQgjIiISKB4aCisiIiISMTyUwVSEERERCRQPHYURERERiRgeymAqwoiIiASKd77/RURERCKHhzKYijAiIiIB4jx0FEZEREQkUngpg6kIIyIiEigeCgAiIiIiEcNDGcxDF3ISEREREREREfEujYQREREJFA/NzC8iIiISMTyUwVSEERERCRSNLxUREREJPQ9lsBJbhFk2u024u+B52bl7w90FzysbUzXcXfA8R064u+B5G5ZeG+4uSHF56CiMSFGUwY6dMtixUwY7dspgx04ZzEM8lMFKbBFGRETEczw0KZyIiIhIxPBQBlMRRkREJFA8FABEREREIoaHMpiKMCIiIgHiPDQUVkRERCRSeCmDqQgjIiISKB6aFE5EREQkYngog6kIIyIiEigeOgojIiIiEjE8lMFUhBEREQkUD52PLCIiIhIxPJTBVIQREREJFA8FABEREZGI4aEMpiKMiIhIoHjn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\n",
      "text/plain": [
       "<Figure size 1440x360 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "\n",
    "def model_confusion_matrix(predictions):\n",
    "     \n",
    "    fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(20, 5))\n",
    "    \n",
    "    print(\"Confusion Matrix by Outcome\")\n",
    "    confusion_matrix = pd.crosstab(df['EVENT_LABEL'], predictions['outcomes'].astype(str), margins=True, rownames=['Actual'], colnames=['Predicted'])\n",
    "    confusion_matrix_pct = pd.crosstab(df['EVENT_LABEL'], predictions['outcomes'].astype(str), normalize=\"all\", margins=True,rownames=['Actual'], colnames=['Predicted']).round(3)\n",
    "    sns.heatmap(confusion_matrix, annot=True, fmt='g',cmap=\"YlGnBu\", ax=ax1)\n",
    "    sns.heatmap(confusion_matrix_pct, annot=True, fmt='g',cmap=\"YlGnBu\", ax=ax2)\n",
    " \n",
    "    ax1.title.set_text('Counts')\n",
    "    ax2.title.set_text('Pct')\n",
    "\n",
    "    \n",
    "    plt.show()\n",
    "    \n",
    "    \n",
    "model_confusion_matrix(predictions)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  Write Predictions to File\n",
    "\n",
    "-----\n",
    "writing out predictions to a file allows you to analyze with other tools like QuickSight \n",
    "\n",
    "```python\n",
    "\n",
    "# -- optionally write predictions to a CSV file -- \n",
    "predictions.to_csv(FILE + \".csv\", index=False)\n",
    "# -- or to a XLS file \n",
    "predictions.to_excel(FILE + \".xlsx\", index=False)\n",
    "\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "predictions.to_csv(\"project_1_5k_predictions.csv\", index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "conda_amazonei_mxnet_p36",
   "language": "python",
   "name": "conda_amazonei_mxnet_p36"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
